約 4,518,313 件
https://w.atwiki.jp/projectwiki/pages/15.html
OpenCV導入編 OpenCVのインストール ここを編集
https://w.atwiki.jp/ken_hide/pages/14.html
@wikiの使い方良く分からないので適当です。 OpenCV2.1 を導入してみました。 sourceforgeで落とせるんですが 何と今回、VC2008用にパッケージを用意してくれているんです 便利ですねー ってことで取ってきてクリックしてあとは自分で登録する感じですね。 なんかOpenCV1.1らへんに戻ってきた感じ。いいですねー んでVC2008に導入する方法ですが パッケージダウンロード(OpenCV-2.1.0-win32-vs2008.exe)→展開 VC2008を開いてプロジェクトを作成 (動かすだけならwin32コンソールアプリケーション→空のプロジェクト作成) 設定 libがデバッグ用とリリース用と二つ用意されているので プロジェクト→ プロパティ― → 構成プロパティ― → リンカ 上のタブが デバッグなら 追加依存ファイル cv210d.lib,cxcore210d.lib,highgui210d.lib リリースなら 追加依存ファイル cv210.lib,cxcore210.lib,highgui210.lib と使用するライブラリーを登録。 Fernsが謎に試験段階ということで入ってるのを使いたい人はcvaux210を入れる。 んで ツール→オプション→プロジェクトおよびソリューション→VC++ディレクトリ にインクルードファイルの入っているフォルダを指定して追加 今回は C \OpenCV2.1\include\opencv であとはサンプルをコピペして使用してみてください。 筆者はそれで動きました。 ちなみに2.0からC++に対応していて using namespace cv; と打てばC++版が使えるようになりました 便利! IplImageからMat型になってさらにクラス内関数にコピー関数とか付くようになったので 色々と使い勝手は良くなりましたがC言語と互換性は怪しいです。 あるんですがめんどくさそうです。 Mat→IplImageの関数があったようななかったような
https://w.atwiki.jp/kunanru/pages/31.html
El Capitan マンのためのopencvのインストール方法 sudo pip install opencv-python==3.3.0.10 バージョンを指定しないと最新バージョンを持ってくるのでエルキャピタンでは動かないことに注意.
https://w.atwiki.jp/dendenkeroro/pages/53.html
二次元画像解析であればこれ、OpenCVです。 VisualStudio2008であればすでにOpenCVの導入方法はいたるところで公開されています。 最近になってVisualStudio2010が公開されたようですね。 ということでここでは2010での設定方法から紹介します。 使用環境 Windows7 Pro 64bit OpenCV 1.0 参考ページはこちら↓をクリック 本家はこちら↓をクリック。サンプルコードがたくさんです。 OpenCV設定編 プロジェクトを立ち上げる VisualStudioに関するある程度の知識はあるものとして説明していきます。 まずは新規プロジェクトを立ち上げて、下記の図のとおりWin32コンソールアプリケーションで作ります。 空のプロジェクトにしておくことを忘れないでください。 プロジェクトプロパティの設定をする VisualStudio2010はなんとVC++ディレクトリの設定が出来ないそうです。 そのかわり、プロジェクトのプロパティで設定するそうなので、それを説明していきます。 下図のような画面が出ているでしょうか?ソースファイルはあらかじめ「新しい項目を追加」しておいてください。ファイル名は適当に。 「ツールバー」の「プロジェクト」から「オプション」を押してください。 「オプション」を押すと下図のようなウィンドウが出るはずです。 この中に「VC++ディレクトリ」が存在するわけですね。 ウィンドウ左上の「構成(C)」を「すべての構成」にしてください。 その上で赤枠で囲った「インクルードディレクトリ」と「ライブラリディレクトリ」を追加していきます。 さて、では実際に「インクルードディレクトリ」と「ライブラリディレクトリ」を追加しましょう。 まずはインクルードディレクトリを追加します。クリックすると下図のようなウィンドウが新たに開きます。 ウィンドウ上部のテキストボックスはデフォルトでは空白ですが、下図では既に4行埋まっていますね。 ProgramFileの後ろが何やらおかしな記号になっていますが、これは私のパソコンが64bitなため、こういった表記になります。 基本的には直接OpenCVのディレクトリを選んで来ればいいでしょう。 出来たらOKを押してください。 次にライブラリディレクトリを追加します。 やり方はたいして変わりません。下図を参考にしてください。 さて最後です。オプション画面に戻ります。 左側の「リンカー」から「入力」を選んでください。 右側に「追加の依存ファイル」ってのがあるはずです。 同じようにここにも追加していくわけですが、これは下図のようにファイル名を直接書けばOKです。 ちなみにこれは「省略することが可能」です。その代りプログラムソース内で直接読み込む必要があります。 #includeの羅列と、メイン文との間に以下の内容を記述すれば直接ライブラリファイルを読み込んでくれます。 #include ~~ ・・・ #pragma comment(lib, cv.lib ) #pragma comment(lib, cvaux.lib ) #pragma comment(lib, cvcam.lib ) #pragma comment(lib, cvhaartraining.lib ) #pragma comment(lib, highgui.lib ) ・・・ int main (int argc, char **argv){~~ といった感じ。 プログラミングを始めよう 設定も終わったことですし、さっそくプログラムしてみましょう。 ソースは冒頭で紹介した「OpenCVで学ぶ画像解析」から拝借しています。 画像は適当に選びました(笑) エラーが出た! 先に設定の仕方を説明しましたが、このままだとエラーが出ることがあります。 cxcore100.dllが見つかりません。 highgui100.dllが見つかりません。 この原因は各DLLファイルの置いてあるライブラリを参照し忘れているか、パスが通っていないかです。 パスを通すには「システムの環境変数」に指定ライブラリのアドレスを入力することで解決できます。 それでも治らない、という人! 見つからないと怒られたDLLファイルを「C \Windows\System32」もしくは「C \Windows\SysWOW64」にコピーしてください。 後者はWindows64bit用になっています。
https://w.atwiki.jp/arprojectfun/pages/49.html
ノート - OpenCV - OpenCVの導入 OpenCVのダウンロード OpenCVのインストール VisualStudioの設定インクルード・ライブラリパスの設定 プロジェクトの設定 依存するライブラリの設定 サンプルを動かす解説構造体 cvCreateCameraCapture関数 cvSetCaptureProperty関数 cvQueryFrame関数 真っ黒画面しか表示されないときは注意コメントどうぞ OpenCVのダウンロード まず、ここからOpenCV1.0をダウンロードして下さい。http //sourceforge.net/projects/opencvlibrary/ DownLoadの右側のViewAllをクリックするとすべてのバージョンの一覧が出てきます。 2.0ではwebカメラの映像を扱えないので注意してください。 OpenCVのインストール 次にダウンロードしてきた実行ファイルを起動して、インストールします。適当にOKや次を押して進めてください。 基本的にデフォルトでいいです。 システム変数のPathの設定する。[システムのプロパティ] - [詳細設定] - [環境変数]を開きます。 システム変数のPATH(Path)の値に 「C \Program Files\OpenCV\bin」 を後ろに追加する。 もしPathであるなら、PATHに変更しないとOpenCVは使えない。(システム上は大文字でも小文字でも構いません) VisualStudioの設定 インクルード・ライブラリパスの設定 インクルードパスに以下を追加します。C \Program Files\OpenCV\cv\include C \Program Files\OpenCV\cvaux\include C \Program Files\OpenCV\cxcore\include C \Program Files\OpenCV\otherlibs\highgui ライブラリパスに以下を設定しますC \Program Files\OpenCV\lib プロジェクトの設定 依存するライブラリの設定 プロジェクトのプロパティを開く [構成プロパティ] - [リンカ] - [入力]を開く 以下のライブラリを依存するファイルに追加する cvcam.lib highgui.lib cxts.lib cv.lib cxcore.lib ml.lib cvaux.lib cvhaartraining.lib これで下準備は完了です サンプルを動かす 以下は公式が出しているサンプルから抜粋したものです。 #include cv.h #include highgui.h #include ctype.h int main (int argc, char **argv){ CvCapture *capture = 0; IplImage *frame = 0; double w = 320, h = 240; int c; // (1)コマンド引数によって指定された番号のカメラに対するキャプチャ構造体を作成する if (argc == 1 || (argc == 2 strlen (argv[1]) == 1 isdigit (argv[1][0]))) capture = cvCreateCameraCapture (argc == 2 ? argv[1][0] - 0 0); /* この設定は,利用するカメラに依存する */ // (2)キャプチャサイズを設定する. cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, w); cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, h); cvNamedWindow ("Capture", CV_WINDOW_AUTOSIZE); // (3)カメラから画像をキャプチャする while (1) { frame = cvQueryFrame (capture); cvShowImage ("Capture", frame); c = cvWaitKey (2); if (c == \x1b ) break; } cvReleaseCapture ( capture); cvDestroyWindow ("Capture"); return 0; } 空のプロジェクトを作成して、以上のコードをコピペしてください。 ビルドして実行できれば成功です。 解説 構造体 CvCapture *capture; キャプチャするカメラの情報を格納する変数 IplImage *frame; OpenCVで扱える画像を格納する変数 cvCreateCameraCapture関数 capture = cvCreateCameraCapture (argc == 2 ? argv[1][0] - 0 0); 引数にカメラの番号を入れると、その番号のカメラの情報を返す関数 サンプルではコマンド引数に指定されたカメラの話のお号を引数にしている。 無かった場合は0番目を入れている。 cvSetCaptureProperty関数 cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, w); cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, h); カメラのキャプチャサイズを設定する関数 第1引数にキャプチャするカメラの変数、第2引数に設定する項目、第3引数にはその値を指定します。 cvQueryFrame関数 frame = cvQueryFrame (capture); 引数にCvCaptureを入れてやると、そのカメラの現在のフレームを返り値として返してくれる。 サンプルではその画像を常に持ってきて、ウィンドウに表示している。 真っ黒画面しか表示されないときは VistaでOpenCV こちらの記事を参考に、ewclib.h をインクルードしてみてください。 注意 上記の記事のサンプルコードは内容が少し古いので、 ビルドするにはすこし修正が必要です。 【修正点1】 14行目辺りの EWC_Open(SIZE_X, SIZE_Y, FPS); を EWC_Open(CAM_NUM, SIZE_X, SIZE_Y, FPS); に変更する。 【修正点2】 32行目辺りの EWC_Close(); を EWC_Close(CAM_NUM); もしくは、 EWC_CloseAll(); に変更する。 コメントどうぞ 名前 コメント
https://w.atwiki.jp/temtem/pages/11.html
OpenCVで処理した画像をDirectXで表示する。
https://w.atwiki.jp/prepress-tips/pages/176.html
最終更新日時: 2010/10/17 このページは 作成中です。 開発環境 教科書 GTK+ のライセンス openCV のライセンス ex01 ex01_gtk openCV に日本語文字を描画 開発環境 教科書 GTK+ のライセンス openCV のライセンス ex01 ex01_gtk openCV に日本語文字を描画 Edit 開発環境 開発環境は Ubuntu 10.04 LTS ( ubuntu LiveUSB で利用 )。 openCV は簡単にインストールできる。 その他に必要なものも ほぼ最初から入っている。( なくても簡単に追加インストールできる。 ) Tera Term から ssh でログインしたとき 最初に export DISPLAY= 0.0 戻すときは export DISPLAY=localhost 10.0 ヘルプ devhelp firefox http //opencv.jp/opencv-2svn/c/ コンパイル gcc -o [実行ファイル] [ソースファイル] `pkg-config gtk+-2.0 opencv --cflags --libs` 教科書 次の2冊。どちらも 初心者にはとてもわかりやすい。 入門GTK+ Essential OpenCV Programming with Visual C++ 2008 GTK+ のライセンス GTK+ のライセンスは GNU LGPL 2.1 。 このページのプログラムも このライセンスに準じる。 openCV のライセンス openCV のライセンスは 以下のとおり。 このページのプログラムも このライセンスに準じる。 license.txt IMPORTANT READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By downloading, copying, installing or using the software you agree to this license. If you do not agree to this license, do not download, install, copy or use the software. License Agreement For Open Source Computer Vision Library Copyright (C) 2000-2008, Intel Corporation, all rights reserved. Copyright (C) 2008-2010, Willow Garage Inc., all rights reserved. Third party copyrights are property of their respective owners. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met * Redistribution s of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistribution s in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * The name of the copyright holders may not be used to endorse or promote products derived from this software without specific prior written permission. This software is provided by the copyright holders and contributors "as is" and any express or implied warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose are disclaimed. In no event shall the Intel Corporation or contributors be liable for any direct, indirect, incidental, special, exemplary, or consequential damages (including, but not limited to, procurement of substitute goods or services; loss of use, data, or profits; or business interruption) however caused and on any theory of liability, whether in contract, strict liability, or tort (including negligence or otherwise) arising in any way out of the use of this software, even if advised of the possibility of such damage. ex01 画像を読み込み表示するプログラム。モノクロで表示する機能付き。 先ほどの書籍のサンプルを ubuntu で実行できるよう修正したもの。Essential OpenCV Programming with Visual C++ 2008 Edit ex01_index.txt * 変数の定義 / ? WIN ? img_src ? Form1 * 関数の定義 / ? btnLoad_Click // ? btnGray_Click // ? btnReset_Click // ? Form1_Load // ? Form1_FormClosed // ? Form1 - quit // / Form1_FormClosed ; * 処理 / / Form1 - new ? Form1 - vbox // ? Form1 - hbox1 // ? Form1 - btnLoad // ? Form1 - hbox2 // ? Form1 - btnGray // ? Form1 - btnReset // / Form1_Load ; / Form1 - run /name ex01.cpp ubuntu版 / ex01.c // このプログラムは 以下の書籍のサンプルを ubuntu で実行できるよう修正したものです。 // Essential OpenCV Programming with Visual C++ 2008 // http //www.cutt.co.jp/book/978-4-87783-232-2.html #include cv.h #include cxcore.h #include highgui.h #include gtk/gtk.h / 変数の定義 / 関数の定義 int main ( int argc , char* argv[] ) { gtk_init ( &argc , &argv ) ; / 処理 return 0 ; } /name 未指定 / /use ex01_detail.txt ex01_detail.txt - btn_Click / WIN / img_src / img_gray /?- btn_Click , WIN , img_src , img_gray * btnLoad_Click // void btnLoad_Click ( ) ? openFileDialog1 - new // / openFileDialog1 - show ? openFileDialog1 - result // / if( ! openFileDialog1 - result OK ) { openFileDialog1 - free ; return ; } ? fname - from openFileDialog1 // / openFileDialog1 - free / img_src - load fname / img_src - show / fname -free * btnGray_Click // void btnGray_Click ( ) ? img_gray - new // / img_gray - from img_src / img_gray - show / img_gray - free * btnReset_Click // void btnReset_Click ( ) / img_src - show * Form1_Load // void Form1_Load ( ) / WIN - new * Form1_FormClosed // void Form1_FormClosed ( ) / WIN - close / img_src - free * WIN / gchar* WIN = ex01 ; * WIN - new / cvNamedWindow( WIN , CV_WINDOW_AUTOSIZE ) ; * WIN - close / cvDestroyWindow( WIN ) ; * img_src / IplImage* img_src ; * img_src - free / cvReleaseImage( &img_src ) ; * img_src - load fname / img_src = cvLoadImage( fname , CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR ) ; * img_src - show / cvShowImage( WIN , img_src ) ; * img_gray - new // IplImage* img_gray ; * img_gray - from img_src / img_gray = cvCreateImage( cvGetSize( img_src ) , IPL_DEPTH_8U , 1 ) ; cvCvtColor( img_src , img_gray , CV_BGR2GRAY ) ; * img_gray - free / cvReleaseImage( &img_gray ) ; * img_gray - show / cvShowImage( WIN , img_gray ) ; ex01_detail.txt - openFileDialog1 / fname / Form1 /?- openFileDialog1 , fname , Form1 * openFileDialog1 - new // GtkWidget* openFileDialog1 ; openFileDialog1 = gtk_file_chooser_dialog_new( load image , GTK_WINDOW( Form1 ) , GTK_FILE_CHOOSER_ACTION_OPEN , GTK_STOCK_CANCEL , GTK_RESPONSE_CANCEL , GTK_STOCK_OPEN , GTK_RESPONSE_ACCEPT , NULL ); * openFileDialog1 - show / gtk_widget_show_all( openFileDialog1 ) ; * openFileDialog1 - result // gint openFileDialog1_result ; openFileDialog1_result = gtk_dialog_run( GTK_DIALOG( openFileDialog1 ) ) ; * openFileDialog1 - result OK / ( openFileDialog1_result == GTK_RESPONSE_ACCEPT ) * openFileDialog1 - free / gtk_widget_destroy( openFileDialog1 ) ; * fname - from openFileDialog1 // gchar* fname ; fname = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER( openFileDialog1 ) ) ; * fname -free / g_free( fname ) ; * Form1 / GtkWidget* Form1 ; * Form1 - new / Form1 = gtk_window_new( GTK_WINDOW_TOPLEVEL ) ; gtk_window_set_title ( GTK_WINDOW( Form1 ) , Form1 ) ; gtk_widget_set_size_request( Form1 , 160 , 80 ) ; g_signal_connect( G_OBJECT( Form1 ) , destroy , G_CALLBACK( Form1_quit ) , NULL ) ; * Form1 - run / gtk_widget_show_all( Form1 ) ; gtk_main() ; * Form1 - quit // void Form1_quit ( ) gtk_main_quit () ; * Form1 - vbox // GtkWidget* vbox ; vbox = gtk_vbox_new( FALSE , 3 ) ; gtk_container_add( GTK_CONTAINER( Form1 ) , vbox ) ; gtk_container_set_border_width( GTK_CONTAINER( vbox ) , 6 ) ; * Form1 - hbox1 // GtkWidget* hbox1 ; hbox1 = gtk_hbox_new( FALSE , 5 ) ; gtk_box_pack_start( GTK_BOX( vbox ) , hbox1 , TRUE , FALSE , 2 ) ; * Form1 - hbox2 // GtkWidget* hbox2 ; hbox2 = gtk_hbox_new( FALSE , 0 ) ; gtk_box_pack_start( GTK_BOX( vbox ) , hbox2 , TRUE , FALSE , 2 ) ; * Form1 - btnLoad // GtkWidget* btnLoad ; btnLoad = gtk_button_new_with_label( 画像読込 ) ; gtk_box_pack_start( GTK_BOX( hbox1 ) , btnLoad , FALSE , FALSE , 6 ) ; g_signal_connect( G_OBJECT( btnLoad ) , clicked , G_CALLBACK( btnLoad_Click ) , NULL ) ; * Form1 - btnGray // GtkWidget* btnGray ; btnGray = gtk_button_new_with_label( モノクロ ) ; gtk_box_pack_start( GTK_BOX( hbox2 ) , btnGray , FALSE , FALSE , 6 ) ; g_signal_connect( G_OBJECT( btnGray ) , clicked , G_CALLBACK( btnGray_Click ) , NULL ) ; * Form1 - btnReset // GtkWidget* btnReset ; btnReset = gtk_button_new_with_label( 元に戻す ) ; gtk_box_pack_start( GTK_BOX( hbox2 ) , btnReset , FALSE , FALSE , 6 ) ; g_signal_connect( G_OBJECT( btnReset ) , clicked , G_CALLBACK( btnReset_Click ) , NULL ) ; ex01_gtk 画像を読み込み モノクロ変換し 保存するプログラム。 先ほどのプログラムに 保存機能を加え 全面的に書き直したもの。ソースを少し修正すれば チャネルミキシングなども試せる。 Edit ex01_gtk_index.txt * 変数の定義 / ? 画像ウィンドウ ? 操作パネル ? 元画像 ? 変換画像 * 関数の定義 / ? 画像読込ボタン - onClick ? 選択ダイアログ - new load // / 選択ダイアログ - show ? 選択ダイアログ - result // / if( 選択ダイアログ - cancel ) { 選択ダイアログ - free ; return ; } / 選択ダイアログ - set 元画像 fname ; 選択ダイアログ - free / 元画像 - free / 元画像 - new load / 画像ウィンドウ - 画像 free / 画像ウィンドウ - new 元画像 ; 画像ウィンドウ - show ? モノクロボタン - onClick / 変換画像 - free / 変換画像 - new ; 変換画像 - conv / 画像ウィンドウ - 画像 free / 画像ウィンドウ - new 変換画像 ; 画像ウィンドウ - show ? 元に戻すボタン - onClick / 画像ウィンドウ - 画像 free / 画像ウィンドウ - new 元画像 ; 画像ウィンドウ - show ? 画像保存ボタン - onClick / if( 変換画像 - 未変換 ) { return ; } ? 選択ダイアログ - new save // / 選択ダイアログ - show ? 選択ダイアログ - result // / if( 選択ダイアログ - cancel ) { 選択ダイアログ - free ; return ; } / 選択ダイアログ - set 変換画像 fname ; 選択ダイアログ - free / 変換画像 - save ? 操作パネル - quit // / 元画像 - free ; 変換画像 - free * 処理 / / 操作パネル - new ? 操作パネル - vbox // ? 操作パネル - hbox1 // ? 操作パネル - 画像読込ボタン // ? 操作パネル - 画像保存ボタン // ? 操作パネル - hbox2 // ? 操作パネル - モノクロボタン // ? 操作パネル - 元に戻すボタン // / 画像ウィンドウ - new / 画像ウィンドウ - new canvas ; 画像ウィンドウ - show / 操作パネル - run /name ex01.c gtk版 / ex01_gtk.c #include cv.h #include cxcore.h #include highgui.h #include gtk/gtk.h / 変数の定義 / 関数の定義 int main ( int argc , char* argv[] ) { gtk_init ( &argc , &argv ) ; / 処理 return 0 ; } /name 未指定 / /use ex01_gtk_detail.txt ex01_gtk_detail.txt - 元画像 / 変換画像 / 変換 /?- 元画像 * 元画像 / gchar* img_src_fname ; GdkPixbuf* img_src ; IplImage* img_src_cv ; * 元画像 - fname / img_src_fname * 元画像 - new load / img_src = gdk_pixbuf_new_from_file( img_src_fname , NULL ) ; ? 元画像 - w , h , ch , rs // img_src_cv = cvCreateImageHeader( cvSize( img_w, img_h ) , IPL_DEPTH_8U, img_ch ); img_src_cv - imageData = gdk_pixbuf_get_pixels( img_src ) ; g_free( img_src_fname ) ; * 元画像 - free / if( img_src != NULL ) { cvReleaseImageHeader( &img_src_cv ) ; g_object_unref( G_OBJECT( img_src ) ) ; } * 元画像 - w , h , ch , rs // *~ gint img_w ; gint img_h ; gint img_ch ; gint img_rs ; img_w = gdk_pixbuf_get_width( img_src ) ; img_h = gdk_pixbuf_get_height( img_src ) ; img_ch = gdk_pixbuf_get_n_channels( img_src ) ; img_rs = gdk_pixbuf_get_rowstride( img_src ) ; /?- 変換画像 * 変換画像 / gchar* img_conv_fname ; GdkPixbuf* img_conv ; IplImage* img_conv_cv ; * 変換画像 - fname / img_conv_fname * 変換画像 - 未変換 / ( img_conv == NULL ) * 変換画像 - new / ? 元画像 - w , h , ch , rs // img_conv_cv = cvCreateImage( cvSize( img_w, img_h ) , IPL_DEPTH_8U, 3 ); img_conv = gdk_pixbuf_new_from_data( img_conv_cv - imageData , GDK_COLORSPACE_RGB , FALSE , 8 , img_w , img_h , img_conv_cv - widthStep , NULL , NULL ); * 変換画像 - free / if( img_conv != NULL ) { cvReleaseImage( &img_conv_cv ) ; g_object_unref( G_OBJECT( img_conv ) ) ; } * 変換画像 - conv / / いろいろな変換 - rgb to gray * いろいろな変換 - rgb to bgr / cvCvtColor( img_src_cv , img_conv_cv , CV_RGB2BGR ) ; * いろいろな変換 - rgb to gray / IplImage* img_gray_cv ; img_gray_cv = cvCreateImage( cvSize( img_w, img_h ) , IPL_DEPTH_8U, 1 ) ; cvCvtColor( img_src_cv , img_gray_cv , CV_RGB2GRAY ) ; cvCvtColor( img_gray_cv , img_conv_cv , CV_GRAY2RGB ) ; cvReleaseImage( &img_gray_cv ) ; * いろいろな変換 - rgb to gray 2 / CvMat* rgb_2_bgr ; rgb_2_bgr = cvCreateMat( img_ch , img_ch , CV_32FC1 ) ; cvSetZero( rgb_2_bgr ) ; cvmSet( rgb_2_bgr , 0 , 2 , 1.0 ) ; cvmSet( rgb_2_bgr , 1 , 1 , 1.0 ) ; cvmSet( rgb_2_bgr , 2 , 0 , 1.0 ) ; CvMat* offset ; offset = cvCreateMat( img_ch , 1 , CV_32FC1 ) ; cvSet( offset , cvScalarAll( 0.0 ) , NULL ) ; // cvSetZero( offset ) IplImage* img_bgr_cv ; IplImage* img_gray_cv ; img_bgr_cv = cvCreateImage( cvSize( img_w, img_h ) , IPL_DEPTH_8U, img_ch ) ; img_gray_cv = cvCreateImage( cvSize( img_w, img_h ) , IPL_DEPTH_8U, 1 ) ; cvTransform( img_src_cv , img_bgr_cv , rgb_2_bgr , offset ) ; cvCvtColor( img_bgr_cv , img_gray_cv , CV_BGR2GRAY ) ; cvReleaseImage( &img_bgr_cv ) ; cvReleaseImage( &img_gray_cv ) ; cvReleaseMat( &rgb_2_bgr ) ; cvReleaseMat( &offset ) ; * 変換画像 - save / gdk_pixbuf_save( img_conv , img_conv_fname , tiff , NULL , compression , 5 , NULL // LZW ) ; g_free( img_conv_fname ) ; ex01_gtk_detail.txt - 画像ウィンドウ / 操作パネル / 選択ダイアログ /?- 画像ウィンドウ * 画像ウィンドウ / GtkWidget* WIN_img ; GtkWidget* WIN_canvas ; GtkWidget* WIN ; * 画像ウィンドウ - new / WIN = gtk_window_new( GTK_WINDOW_TOPLEVEL ) ; gtk_window_set_title( GTK_WINDOW( WIN ) , 画像 ) ; gtk_window_set_default_size( GTK_WINDOW( WIN ) , 400 , 300 ) ; gtk_window_move( GTK_WINDOW( WIN ) , 0 , 140 ) ; * 画像ウィンドウ - show / gtk_widget_show_all( WIN ) ; * 画像ウィンドウ - new canvas / WIN_canvas = gtk_scrolled_window_new( NULL , NULL ) ; gtk_scrolled_window_set_placement( GTK_SCROLLED_WINDOW ( WIN_canvas ) , GTK_CORNER_TOP_LEFT ) ; gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW ( WIN_canvas ) , GTK_POLICY_AUTOMATIC , GTK_POLICY_AUTOMATIC ) ; gtk_container_add ( GTK_CONTAINER( WIN ) , WIN_canvas ) ; * 画像ウィンドウ - new 元画像 / WIN_img = gtk_image_new_from_pixbuf( img_src ) ; gtk_scrolled_window_add_with_viewport( GTK_SCROLLED_WINDOW ( WIN_canvas ) , WIN_img ) ; * 画像ウィンドウ - new 変換画像 / WIN_img = gtk_image_new_from_pixbuf( img_conv ) ; gtk_scrolled_window_add_with_viewport( GTK_SCROLLED_WINDOW ( WIN_canvas ) , WIN_img ) ; * 画像ウィンドウ - 画像 free / if( WIN_img != NULL ) { gtk_object_destroy( GTK_OBJECT( WIN_img ) ) ; } /?- 操作パネル * 操作パネル / GtkWidget* Panel ; * 操作パネル - new / Panel = gtk_window_new( GTK_WINDOW_TOPLEVEL ) ; gtk_window_set_title ( GTK_WINDOW( Panel ) , 操作パネル ) ; gtk_widget_set_size_request( Panel , 170 , 80 ) ; g_signal_connect( G_OBJECT( Panel ) , destroy , G_CALLBACK( Panel_quit ) , NULL ) ; * 操作パネル - run / gtk_widget_show_all( Panel ) ; gtk_main() ; * 操作パネル - quit // void Panel_quit ( ) gtk_main_quit () ; * 操作パネル - vbox // GtkWidget* vbox ; vbox = gtk_vbox_new( FALSE , 3 ) ; gtk_container_add( GTK_CONTAINER( Panel ) , vbox ) ; gtk_container_set_border_width( GTK_CONTAINER( vbox ) , 6 ) ; * 操作パネル - hbox1 // GtkWidget* hbox1 ; hbox1 = gtk_hbox_new( FALSE , 0 ) ; gtk_box_pack_start( GTK_BOX( vbox ) , hbox1 , TRUE , FALSE , 2 ) ; * 操作パネル - hbox2 // GtkWidget* hbox2 ; hbox2 = gtk_hbox_new( FALSE , 0 ) ; gtk_box_pack_start( GTK_BOX( vbox ) , hbox2 , TRUE , FALSE , 2 ) ; * 操作パネル - 画像読込ボタン // GtkWidget* buttonLoad ; buttonLoad = gtk_button_new_with_label( 画像読込 ) ; gtk_box_pack_start( GTK_BOX( hbox1 ) , buttonLoad , FALSE , FALSE , 6 ) ; g_signal_connect( G_OBJECT( buttonLoad ) , clicked , / G_CALLBACK( & 画像読込ボタン - onClick ) , NULL ) ; * 操作パネル - 画像保存ボタン // GtkWidget* buttonSave ; buttonSave = gtk_button_new_with_label( 画像保存 ) ; gtk_box_pack_start( GTK_BOX( hbox1 ) , buttonSave , FALSE , FALSE , 6 ) ; g_signal_connect( G_OBJECT( buttonSave ) , clicked , / G_CALLBACK( & 画像保存ボタン - onClick ) , NULL ) ; * 操作パネル - モノクロボタン // GtkWidget* buttonGray ; buttonGray = gtk_button_new_with_label( モノクロ ) ; gtk_box_pack_start( GTK_BOX( hbox2 ) , buttonGray , FALSE , FALSE , 6 ) ; g_signal_connect( G_OBJECT( buttonGray ) , clicked , / G_CALLBACK( & モノクロボタン - onClick ) , NULL ) ; * 操作パネル - 元に戻すボタン // GtkWidget* buttonReset ; buttonReset = gtk_button_new_with_label( 元に戻す ) ; gtk_box_pack_start( GTK_BOX( hbox2 ) , buttonReset , FALSE , FALSE , 6 ) ; g_signal_connect( G_OBJECT( buttonReset ) , clicked , / G_CALLBACK( & 元に戻すボタン - onClick ) , NULL ) ; * 画像読込ボタン - onClick // void buttonLoad_onClick ( ) * & 画像読込ボタン - onClick / buttonLoad_onClick * モノクロボタン - onClick // void buttonGray_onClick ( ) * & モノクロボタン - onClick / buttonGray_onClick * 元に戻すボタン - onClick // void buttonReset_onClick ( ) * & 元に戻すボタン - onClick / buttonReset_onClick * 画像保存ボタン - onClick // void buttonSave_onClick ( ) * & 画像保存ボタン - onClick / buttonSave_onClick /?- 選択ダイアログ * 選択ダイアログ - new load // GtkWidget* file_dialog ; file_dialog = gtk_file_chooser_dialog_new( 画像選択 , GTK_WINDOW( Panel ) , GTK_FILE_CHOOSER_ACTION_OPEN , GTK_STOCK_CANCEL , GTK_RESPONSE_CANCEL , GTK_STOCK_OPEN , GTK_RESPONSE_ACCEPT , NULL ); * 選択ダイアログ - new save // GtkWidget* file_dialog ; file_dialog = gtk_file_chooser_dialog_new( 画像選択 , GTK_WINDOW( Panel ) , GTK_FILE_CHOOSER_ACTION_SAVE , GTK_STOCK_CANCEL , GTK_RESPONSE_CANCEL , GTK_STOCK_SAVE , GTK_RESPONSE_ACCEPT , NULL ); gtk_file_chooser_set_current_name( GTK_FILE_CHOOSER( file_dialog ) , untitled.tif ) ; gtk_file_chooser_set_do_overwrite_confirmation( GTK_FILE_CHOOSER( file_dialog ) , TRUE ) ; * 選択ダイアログ - show / gtk_widget_show_all( file_dialog ) ; * 選択ダイアログ - free / gtk_widget_destroy( file_dialog ) ; * 選択ダイアログ - result // gint file_dialog_result ; file_dialog_result = gtk_dialog_run( GTK_DIALOG( file_dialog ) ) ; * 選択ダイアログ - cancel / ( file_dialog_result != GTK_RESPONSE_ACCEPT ) * 選択ダイアログ - set 元画像 fname / / 元画像 - fname = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER( file_dialog ) ) ; * 選択ダイアログ - set 変換画像 fname / / 変換画像 - fname = gtk_file_chooser_get_filename( GTK_FILE_CHOOSER( file_dialog ) ) ; openCV に日本語文字を描画 openCV に GTK+ で日本語文字を描画する。 draw_text.c #include cv.h #include cxcore.h #include highgui.h #include gtk/gtk.h // gcc -o draw_text draw_text.c `pkg-config gtk+-2.0 opencv --cflags --libs` // ./draw_text int main ( int argc , char* argv[] ) { gtk_init ( argc , argv ) ; gint img_w ; gint img_h ; // サイズ img_w = 260 ; img_h = 60 ; IplImage* img_org_cv ; // 元の画像 - openCV で作成 img_org_cv = cvCreateImage( cvSize( img_w, img_h ) , IPL_DEPTH_8U, 3 ); cvSet( img_org_cv , cvScalarAll( 255 ) , NULL ) ; GdkPixbuf* img_org ; // 元の画像 - pixbuf に変換 img_org = gdk_pixbuf_new_from_data( img_org_cv - imageData , GDK_COLORSPACE_RGB , FALSE , 8 , img_w , img_h , img_org_cv - widthStep , NULL , NULL ); GdkPixmap* pixmap ; // 元の画像 - pixmap に変換 gdk_pixbuf_render_pixmap_and_mask( img_org , pixmap , NULL , 255 ) ; GdkColormap* colormap ; GdkGC* gc ; colormap = gdk_drawable_get_colormap( GDK_DRAWABLE( pixmap ) ) ; gc = gdk_gc_new( GDK_DRAWABLE( pixmap ) ) ; PangoFontDescription* font_desc ; // 描画情報 - フォントを指定 font_desc = pango_font_description_from_string( Arial Bold 14 ) ; gchar* markup_str ; // 描画情報 - 内容を指定 markup_str = g_strdup_printf( %s%s%s\x00 , span font= 14 日本語文字を /span , span background = red foreground= yellow font= 20 描画 /span , span font= 14 してみる /span , ) ; PangoLayout* pango_layout ; // 描画情報 - pixmap に描画 GtkWidget* area ; area = gtk_drawing_area_new() ; pango_layout = gtk_widget_create_pango_layout( GTK_WIDGET( area ) , ) ; pango_layout_set_markup( pango_layout , markup_str , -1 ) ; gdk_draw_layout( GDK_DRAWABLE( pixmap ) , gc , 10 , 10 , pango_layout ) ; gtk_object_destroy( GTK_OBJECT( area ) ) ; g_object_unref( G_OBJECT( colormap ) ) ; g_object_unref( G_OBJECT( gc ) ) ; g_free( markup_str ) ; GdkPixbuf* img_text ; // 描画情報 - pixbuf に変換 img_text = gdk_pixbuf_get_from_drawable( NULL , GDK_DRAWABLE( pixmap ) , NULL , 0 , 0 , 0 , 0 , img_w , img_h ) ; IplImage* img_text_cv ; // 描画情報 - openCV に変換 img_text_cv = cvCreateImageHeader( cvSize( img_w , img_h ) , IPL_DEPTH_8U, 3 ); img_text_cv - imageData = gdk_pixbuf_get_pixels( img_text ) ; cvCvtColor( img_text_cv , img_text_cv , CV_RGB2BGR ) ; // 画面に表示 - openCV で cvNamedWindow( openCVに GTK+で描画 , CV_WINDOW_AUTOSIZE ) ; cvShowImage( openCVに GTK+で描画 , img_text_cv ) ; cvWaitKey( 0 ) ; cvDestroyWindow( openCVに GTK+で描画 ) ; // 終了 cvReleaseImageHeader( img_text_cv ) ; g_object_unref( G_OBJECT( img_text ) ) ; cvReleaseImage( img_org_cv ) ; g_object_unref( G_OBJECT( img_org ) ) ; return 0 ; } Edit
https://w.atwiki.jp/javadsge/pages/8732.html
OpenCV
https://w.atwiki.jp/takuzy/pages/11.html
opencvに関する総合的なスレッド opencvとは・・・ Intel Open Source Computer Vision Library の略。 米 Intel 社で開発された画像処理・画像認識用のC言語ライブラリ。 オープンソースであり、商用・非商用を問わず無料で使用できる。 静止画にも動画にも対応しているため、特にロボット工学やバイオメトリクスの研究によく使われている。 推奨プラットフォームは Linux(Intel C Compiler、GNU C)と Microsoft Visual C/C++。 opencvリファレンスマニュアル(日本語版) http //opencv.jp/ opencvの本を買った。(2008年6月22日) 幾何学変換はすべて行列で定義できるようだ。これは特に難しいことはない。その都度リファレンスを見れば対応できるだろう。 cvCreateMat()関数で行列を作成できる。これは今後何かの役に立つかもしれない(応用できるかな?)。cvmSet()で行列の各要素に値を代入。 画像処理において行列演算はかなり密接な関係にあることがわかる。これはマスターしないとね。行列計算の一覧表は参考文献119ページ 2値化の一般的な手法は、RGB各画素の値をすべて足して3で割った値が使われるようだ。(ほかに方法はないのか?)輝度信号と呼ばれるらしい。 cvCvtColor()関数は色空間を変換するのに用いられる。よく出てくる関数なんで覚えておきたい。そして閾値処理をする関数がcvThereshold()関数だ。 ヒストグラムが分かった(おいおい・・・)ヒストグラムとは横軸に白-黒の値。縦軸にその画像内における画素数の頻度をとったものである。難しくない。 輪郭抽出で気になる一文を発見:輪郭を求めることで、物体の面積、周囲長、円形度や重心などの各種特徴量を抽出することができる。 エッジとは明るさの微分で求められる。うーんなるほど!実際には近傍画素の差で求めるのね。1次微分に対するのがsobel 2次微分に対応がlaplacian ハフ変換は2値画像中の直線、円、その他の任意図形の特徴を抽出することができる汎用的な手法である!これは使えるかも知れない。 作成プログラム 顔を認識して輪郭を書くプログラム(2008.6)http //www31.atwiki.jp/takuzy/pages/12.html 顔を認識して輪郭を書くプログラム(ラベリングを用いて顔だけを抽出)(2008.6)http //www31.atwiki.jp/takuzy/pages/13.html 顔を認識してその重心座標を求める(それをRSC232Cポートの外部機器に送信)この二つは実はおんなじ(2008.6)http //www31.atwiki.jp/takuzy/pages/13.html ハフ変換を用いた直線、円検出プログラム(静止画)(2008.7)http //www31.atwiki.jp/takuzy/pages/19.html テンプレートマッチングを用いた目追跡プログラム(2008.7)http //www31.atwiki.jp/takuzy/pages/24.html テンプレートマッチングを用いた目追跡プログラム(動的テンプレート更新つき)(2008.7) 今後の作成予定プログラム 手を認識してipodタッチのようなインターフェースを実現させよう!!(2008.7月末日まで)
https://w.atwiki.jp/nkym_memo/pages/58.html
OpenCV